#include <cstdio>
#include <iostream>
using namespace std;
const int MAXN = 50000;
int t , n , m , k , prime[ MAXN + 5 ];
int mu[ MAXN + 5 ] , d[ MAXN + 5 ] , f[ MAXN + 5 ] , pre_mu[ MAXN + 5 ];
bool vis[ MAXN + 5 ];
void sieve( ) {
mu[ 1 ] = 1 , d[ 1 ] = 1;
for( int i = 2 ; i <= MAXN ; i ++ ) {
if( !vis[ i ] ) {
prime[ ++ k ] = i;
mu[ i ] = -1;
d[ i ] = 2;
}
for( int j = 1 ; j <= k && 1ll * i * prime[ j ] <= MAXN ; j ++ ) {
vis[ i * prime[ j ] ] = 1;
if( i % prime[ j ] == 0 ) {
d[ i * prime[ j ] ] = 2 * d[ i ] - d[ i / prime[ j ] ];
break;
}
mu[ i * prime[ j ] ] = -mu[ i ];
d[ i * prime[ j ] ] = d[ i ] * d[ prime[ j ] ];
}
}
for( int i = 1 ; i <= MAXN ; i ++ ) {
f[ i ] = f[ i - 1 ] + d[ i ];
pre_mu[ i ] = pre_mu[ i - 1 ] + mu[ i ];
}
}
long long solve( int n , int m ) {
int d = min( n , m );
long long Ans = 0;
for( int l = 1 , r ; l <= d ; l = r + 1 ) {
r = min( n / ( n / l ) , m / ( m / l ) );
Ans += 1ll * ( pre_mu[ r ] - pre_mu[ l - 1 ] ) * f[ n / l ] * f[ m / l ];
}
return Ans;
}
int main( ) {
sieve( );
scanf("%d",&t);
while( t -- ) {
scanf("%d %d",&n,&m);
printf("%lld\n", solve( n , m ) );
}
return 0;
}